﻿#include<iostream>
#include<vector>
#include<unordered_map>
using namespace std;

//【题目】力扣2958.最多K个重复元素的最长子数组
//【难度】中等
//【提交】https://leetcode.cn/problems/length-of-longest-subarray-with-at-most-k-frequency/submissions/677942280/
//【标签】数组；哈希表；滑动窗口；第119场双周赛
class Solution
{
public:
    int maxSubarrayLength(vector<int>& nums, int k)
    {
        int res = 0;
        int left = 0;
        unordered_map<int, int>cnt;
        for (int right = 0; right < nums.size(); right++)
        {
            cnt[nums[right]]++;
            while (cnt[nums[right]] > k)
            {
                cnt[nums[left]]--;
                left++;
            }
            res = max(res, right - left + 1);
        }
        return res;
    }
};

/*
学习总结：
新加入元素 x=nums[right] 后，通过哈希表计数，如果 x 的出现次数超过 k
则不断右移左指针 left，直到窗口内的 x 的出现次数等于 k 为止
然后用窗口大小 right−left+1 更新答案的最大值。

*/